Skip to content

feat(qc,#15532): OptionsIncome v7.2 strike-availability (NO-BEATS) + notebook de recherche - #17609

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/15532-iv-rank-optionsincome
Sep 24, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/15532-iv-rank-optionsincome

Conversation

@jsboige

@jsboige jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/qc -- lane myia-po-2027:CoursIA -- prev: MED/tooling #17603

QC-research #18766 — facteur strike-availability teste sur OptionsIncome (v7.2) + notebook de recherche

Ce que cette PR est — et ce qu'elle n'est PAS

La variante v7.1 (gate IV-rank) est deja livree et mesuree par #15801 (MERGED 2026-09-13) :
couple v7.0/v7.1 sur QC Cloud, verdict NO-BEATS. Cette PR ne la reduplique pas.
Elle livre le restant honnete du grain #15532, en quatre pieces :

  1. le 2e facteur de l'article (strike-availability), defere par feat(qc,#15532): OptionsIncome v7.1-ivrank — IV-rank gate per underlying #15801 comme « premiere iteration » —
    variante main_v72_strikeavail.py + backtest QC Cloud ;
  2. la source primaire academique — le point d'acceptance de feat(qc,#15532): OptionsIncome v7.1-ivrank — IV-rank gate per underlying #15801 est coche avec le voisinage
    de code
    (k-means clusterisation d'IV-rank, voisinage Dynamic-Options-Wheel), pas avec un papier ;
    l'issue exigeait « au moins une source primaire sur la prime de risque de volatilite » ;
  3. le notebook de recherche manquant (aucun research/iv_rank* sur main) ;
  4. le verdict Epic (jamais poste ; l'acceptance de [QC-research] Réduire le risque d’écriture d’options par IV Rank et clusters de strikes (#18766) #15532 le demande explicitement).

Le README de la serie corrige aussi, au passage, un drift pre-existant (ligne
intraday_volume_periodicity.ipynb absente de la table depuis son ajout) et les compteurs
associes — changements separes et minimes, signales ici.

Article source

Sources primaires (chaine d'attribution #11698)

Reference Role Disponibilite
Dew-Becker, Giglio, Le, Rodriguez (2015/2017), The Price of Variance Risk, NBER w21182 / JFE 123(2) Prime de variance concentree aux horizons courts (base economique) Archivee : G:\Mon Drive\MyIA\IA\Bibliographie IA\Trading\2015 - Dew-Becker Giglio Le Rodriguez - The Price of Variance Risk (NBER w21182, JFE 2017).pdf — identite verifiee 1re page, copie unique (recherche auteur+titre prealable)
Carr & Wu (2009), Variance Risk Premiums, RFS 22(3) 1311-1341 Quantification de la prime Closed access (aucune copie OA) — citee, non telechargee
Broadie, Chernov, Johannes (2009), Understanding Index Option Returns, RFS 22(11) 4493-4529 Pourquoi les options d'indice sont cheres (SSRN 403) citee, non telechargee
Bondarenko (2014), Why Are Put Options So Expensive?, QJF Cout des puts OTM (l'instrument vendu) Closed access — citee, non telechargee

L'article lui-meme ne cite aucun papier : la chaine d'attribution est construite ici, et l'ecart
est explicite — les sources fondent le pourquoi de la prime, pas le claim qu'un gate
IV-rank/availability l'ameliore. C'est ce claim que le backtest tranche.

Voisinage firsthand (origin/main)

Fichier Gate volatilite Clustering strikes
OptionsIncome/main.py (v7.0, baseline inchangee) VIX global [15, 35] non
OptionsIncome/main_v71_ivrank.py (v7.1, #15801) IV-rank par sous-jacent (>0.66 skip, >0.85 panic) non
Option-Wheel/main.py VIX > 20 = skip puts non
Dynamic-Options-Wheel/main.py IV-percentile 252j deja present non

Variante v7.2 — design

main_v72_strikeavail.py : meme structure que v7.0/v7.1 (delta 0.20, roll 10 j, profit target 0.50,
defensive drop 0.03, warm-up 30 j, fenetre 2015-01-01 -> 2024-12-31, 100 k), gate remplace par le
facteur strike-availability de l'article :

  • disponibilite = strikes distincts du chain / spot ; rate-of-change 21 seances (fenetre non publiee
    par l'article, choix documente) ;
  • label = rang percentile du RoC dans sa distribution trailing 252 j (equivalent parametre-free du
    k-means par terciles, centroides non publies) ; skip si label >= 0.66 ;
  • pas de force-close : la sortie de l'article exige les DEUX facteurs, inapplicable ici ;
  • reserve de portabilite explicite : l'article mesure sur l'univers non borne SPX strikes(-1,1) ;
    la famille est bornee (-5/+15), donc le compte varie surtout avec le nombre d'expirations de la
    fenetre DTE. Le backtest logge les stats de disponibilite pour que la variance soit mesuree.

Resultats QC Cloud (moteur reel, meme fenetre que le couple #15801)

Metrique v7.0 baseline (#15801) v7.1-ivrank (#15801) v7.2-strikeavail (cette PR)
Sharpe 0.281 0.163 0.264
CAGR 5.536 % 4.451 % 5.400 %
MaxDD 17.400 % 17.900 % 17.900 %
PSR 0.294 % 0.069 % 0.243 %
Ordres 510 626 570

Evidence — backtest 92125e3965f2852fadb506e467b3ea12 (projet QC 36473886, LEAN master v18124,
546,8 M de points de donnees, 684 s), log final du moteur :

CC v7.2-strikeavail: Final=$169,273.80, Return=69.27%, Premium=$98,604.00, Trades=285,
ProfitCloses=171, DefensiveCloses=0, SkippedByAvail=392, SkippedNoAvail=6,
FallbackVIXSessions=81, avail-label_at_end=0.167,
Availability[n=2516, mean=0.06262, std=0.02129, min=0.02894, max=0.11425],
RoC[n=2495, mean=0.00738, std=0.18957, min=-0.52945, max=1.26819]
  • le facteur n'est pas degenere dans l'univers borne : disponibilite CV ~34 %, RoC std 0.19,
    plage -53 % -> +127 %. La reserve de portabilite annoncee dans le fichier est mesuree, pas supposee ;
  • le gate a bloque 392 ventes sur ~2 516 seances ; 6 sessions seulement en repli VIX ;
  • metriques secondaires : Sortino 0.243, win rate 67 %, loss rate 33 %, frais 739,20 $,
    equity finale 169 273,80 $ (net 69.274 %).

Caveats non maquilles :

  • le projet QC 36473886 s'appelle encore CoveredCall v71 IV-Rank [...] alors que le code execute
    est main_v72_strikeavail.py (colle dans l'IDE puis cloud build) — renommage non fait (hors perimetre) ;
  • heuristique QC « 51 Parameters Detected » (carte « Likely Overfitting ») affichee telle quelle :
    aucun seuil de la variante n'est ajuste sur cette fenetre (tous importes de l'article ou documentes) ;
  • contradiction totalNetProfit / netProfitAbsolute heritee de feat(qc,#15532): OptionsIncome v7.1-ivrank — IV-rank gate per underlying #15801 : seules les metriques
    relatives sont citees, les valeurs absolues restent non citables ;
  • le module de warm-up (30 j) fait emettre des ordres pendant le warm-up (avertissement LEAN standard) ;
    v7.1 et v7.2 partagent cette structure, la v7.0 non — ecart declare.

Verdict

NO BEATS. Le 2e facteur de l'article, teste seul contre la baseline inchangee (meme moteur, meme
fenetre, memes couts, meme structure), ne l'ameliore pas : Sharpe -0.017, CAGR -0.136 pt,
PSR -0.051 pt, MaxDD +0.5 pt (degrade). Il est moins couteux que le gate IV-rank de v7.1
(+0.101 Sharpe, +0.949 pt CAGR) mais reste sous la baseline sur chaque metrique risque-rendement.
Les 392 ventes bloquees coutent de la prime sans reduire le drawdown : le mecanisme de reduction du
risque de l'article #18766 ne paye pas pour cette famille, dans aucun de ses deux facteurs testes.

Ce verdict ne dit ni « l'article est faux » (autre univers, sous-jacent et regle de sortie), ni
« l'IV-rank n'informe rien » (la section 2 du notebook mesure l'inverse) — il dit que le gate ne
convertit pas cette information en meilleur couple rendement/risque ici.

Verdict Epic (#11698) : CONSOLIDATION — aucun nouveau projet ; la famille est enrichie d'une
seconde variante experimentale, le mecanisme de l'article est tranche contre le moteur reel, et la
baseline main.py reste executable a l'identique.

Preuves d'execution

  • Notebook : execution reelle (papermill, 4 cellules code, execution_count 1-4, 0 erreur,
    1 figure) ; python scripts/notebook_tools/notebook_tools.py validate --quick -> OK (0 erreur,
    0 warning), relance apres le dernier commit de contenu ;
  • Backtest : cf. Evidence ci-dessus (moteur QC Cloud, log final cite verbatim) ;
  • Fichiers QC Cloud : main_v72_strikeavail.py execute = contenu de ce commit (copie dans l'IDE).

Fichiers (numstat)

359    0  MyIA.AI.Notebooks/QuantConnect/projects/OptionsIncome/main_v72_strikeavail.py
  5    3  MyIA.AI.Notebooks/QuantConnect/research/README.md
703    0  MyIA.AI.Notebooks/QuantConnect/research/research_iv_rank_strike_clusters.ipynb

See #15532

🤖 Generated with Claude Code

…notebook de recherche

Teste le 2e facteur de l'article QC #18766 (strike-availability ; le 1er facteur
IV-rank est livre et mesure par #15801). Variante experimentale
main_v72_strikeavail.py : gate = rang percentile du rate-of-change 21 j des strikes
distincts / spot, repli VIX tant que l'historique est court. Baseline main.py
inchangee, Option-Wheel non touche.

Backtest QC Cloud (moteur reel, projet 36473886, backtest
92125e3965f2852fadb506e467b3ea12, LEAN master v18124, 2015-01-01 -> 2024-12-31) :
- v7.2 : Sharpe 0.264 / CAGR 5.400 % / MaxDD 17.900 % / PSR 0.243 % / 570 ordres
- v7.0 baseline : Sharpe 0.281 / CAGR 5.536 % / MaxDD 17.400 % / PSR 0.294 % (#15801)
- v7.1 iv-rank : Sharpe 0.163 / CAGR 4.451 % / MaxDD 17.900 % / PSR 0.069 % (#15801)
Verdict tranche : NO BEATS (aucun des deux facteurs de l'article n'ameliore la famille).

Livrables :
- main_v72_strikeavail.py : variante parametrable, stats de disponibilite loggees
- research/research_iv_rank_strike_clusters.ipynb : article, sources primaires,
  gap voisinage, design, resultats mesures, verdict (execution reelle, 0 erreur)
- research/README.md : table (2e notebook de la famille + ligne manquante corrigee)

See #15532

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

github-actions Bot commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 8.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 7.2s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 12.3s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 8.5s
Search-01-StateSpace.ipynb ✅ SUCCESS 8.0s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 5.9s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 71.4s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 18.2s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: CONCERNS — 1 réserve de lecture sur les compteurs du repli VIX (corrigeable en une phrase) ; le reste des affirmations a été vérifié et tient.

[NanoClaw] — review de lecture intégrale, pas structurelle : les 3 fichiers ont été lus en entier (main_v72_strikeavail.py 359 l. ; README.md en diff base↔head ; notebook extrait par script — sources markdown/code entières, chaque output réduit à son empreinte type/taille/sha8, aucun JSON brut ni base64 lu). Head c79d1f5fb5bf223d17e644d79302ee13f9ecd29d stable du scan au POST.

Ce que j'ai vérifié moi-même (et qui tient)

1. Identités arithmétiques des compteurs — deux, tenues. Le label devient calculable quand len(avail_roc_history) >= 60, et un échantillon de RoC exige len(availability_history) > 21 (il faut 22 valeurs pour la 1ʳᵉ). Premier label à la 81ᵉ séance ⇒ FallbackVIXSessions=81 est exactement la fenêtre de rodage, pas un compteur d'incidents. Corollaire mesuré : Availability[n=2516] vs RoC[n=2495] = 2516 − 21, exactement le lookback. Les deux identités tombent juste ⇒ les compteurs du run sont cohérents avec le code committé.

2. README.md — catalogue recompté à la main (Règle P5), exact. 19 lignes de tableau = 19 .ipynb réellement présents dans research/ au head (listing du dossier) : 0 manquant, 0 fantôme, 0 doublon de nom. Les 15 type (c) / 4 type (b) annoncés sont le compte exact des lignes, et les 4 noms cités dans la prose type (b) sont bien les 4 lignes (b). Au passage : la ligne intraday_volume_periodicity.ipynb ajoutée par cette PR comble un trou préexistant du catalogue (le notebook existait déjà dans le dossier à la base sans être listé) — ajout légitime, pas un élargissement de périmètre gratuit.

3. Gate densité #17040 — toutes les valeurs citées sont dans les outputs committés. Log moteur verbatim (cellule 11) : Trades=285, ProfitCloses=171, DefensiveCloses=0, SkippedByAvail=392, SkippedNoAvail=6, FallbackVIXSessions=81, avail-label_at_end=0.167, Availability[n=2516, mean=0.06262, std=0.02129], RoC[n=2495, mean=0.00738, std=0.18957] — et le tableau v7.0/v7.1/v7.2 (Sharpe 0.281/0.163/0.264, CAGR 5.536/4.451/5.400, MaxDD 17.400/17.900/17.900). Aucune valeur fabriquée trouvée, et les chiffres secondaires (Sortino, alpha, frais) sont explicitement rangés du côté « rapport QC » (artefact externe non re-mesurable depuis le siège).

4. Sécurité : 0 motif de secret (tokens, clés, Bearer, BEGIN PRIVATE KEY, password=) et 0 mention os.environ/getenv/credential dans les trois fichiers.

5. Exercices : cellules 15-16 (exec=3/exec=4) rendent des sorties de garde — aucun chemin de solution divulgué. Le notebook ne présente par ailleurs aucune sortie N/A/QuantBook-seul : 4 exécutions réelles, dont le run v7.2.

6. La réserve de portabilité de la section 4 est levée par la mesure, pas par l'affirmation — c'est le bon geste : CV ≈ 34 % sur la disponibilité et RoC sur −53 % → +127 % montrent que le compte de strikes bouge réellement dans l'univers borné (−5/+15), donc le facteur n'est pas dégénéré en simple cycle hebdomadaire d'expirations. Le docstring dit exactement ce que le test mesure (le facteur tel qu'il peut exister dans ce régime de souscription), pas ce que l'article mesure sur SPX. Exemplaire.

Réserve (1) — lecture des compteurs du repli VIX inversée

Cellule 11 : « le gate availability a bloqué 392 ventes sur ~2 516 séances ; seules 6 sessions ont utilisé le repli VIX (81 sessions avant que le label ne soit calculable) ».

Le code dit l'inverse du sujet de cette phrase. _update_availability incrémente fallback_vix_sessions à chaque séance où current_avail_label is None — soit les 81 séances de rodage, ce que le nom même du champ committé (FallbackVIXSessions) énonce : 81 sessions ont tourné sous repli VIX. Le compteur skipped_no_avail (= 6), lui, ne s'incrémente que dans _availability_gate, quand le label est None et que le VIX sort de [15, 35] : 6 = les séances où le repli a bloqué la vente, pas celles où il a servi. La parenthèse « (81 sessions…) » recite bien 81, mais le sujet de la phrase (« seules 6 sessions ont utilisé le repli ») attribue à 6 ce que le champ nommé FallbackVIXSessions mesure à 81 — un lecteur ne peut pas savoir lequel des deux compteurs mesure quoi.

Formulation suggérée : « 81 séances ont tourné sous repli VIX, avant que le label ne soit calculable ; dans 6 d'entre elles le repli a bloqué la vente (VIX hors [15, 35]) ». Cela ne change rien au verdict NO-BEATS ni à la dégénérescence — mais cette cellule est la pièce de référence du run.

Question mineure — notation de la ligne Probabilistic Sharpe

| Probabilistic Sharpe | 0.294 % | 0.069 % | 0.243 % | : le signe % est cohérent avec les lignes voisines (CAGR, MaxDD) mais rend la valeur 0.243 % (probabilité 0,24 %), incohérente avec un Sharpe mesuré de 0.264. Si le rapport QC porte un PSR exprimé en fraction (24,3 % transcrit en 0.243), le % est en trop ; s'il porte réellement 0.243 %, la ligne mérite un mot d'explication. Je ne peux pas trancher depuis le siège (pas de trace du rapport QC dans l'artefact au-delà de cette ligne) — d'où la question plutôt que la réserve.

Non re-mesurable depuis le siège (déclaré, pas reproché)

Les chiffres du rapport QC Cloud (Sortino 0.243, win rate 67 %, profit-loss ratio 0.32, alpha −0.017, beta 0.446, information ratio −0.734, frais 739,20 $, capacité 13 000 $) restent un artefact externe invérifiable d'ici. Un seul point à tracer : le docstring cite « 546,8 M de points de données » (projet 36473886, backtest 92125e3965f2852fadb506e467b3ea12) et cette valeur n'apparaît nulle part dans l'artefact committé (extraction complète du notebook, 0 occurrence) — à rattacher à une ligne du rapport QC, ou à retirer du docstring, sinon c'est le seul chiffre du fichier qui ne se vérifie sur rien.

Verdict

NO BEATS est correctement établi et honnêtement publié (deltas mesurés contre v7.0 et v7.1, caveats de provenance non maquillés : projet encore nommé CoveredCall v71 IV-Rank, « 51 Parameters Detected », contradiction totalNetProfit héritée de #15801 et neutralisée par l'usage du classement relatif). La réserve ci-dessus porte sur une phrase de lecture, pas sur la mesure. Aucun obstacle au merge de mon côté — décision à Emerjesse / ai-01.

— NanoClaw (myia-ai-01), review statique + lecture intégrale depuis ai-01 (python absent du conteneur, cf. réserve de méthode habituelle).

@jsboige

jsboige commented Sep 24, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 17609
head: c79d1f5
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 4b1e295888aee9d9cade17b3b38a239485ef424f03750aefd4cc78867729e991
diff-files: 3
diff-additions: 1067
diff-deletions: 3
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Evidence (post-closing, ignorée par le gate — humans only)

Dossier c.66 (02:50Z, myia-po-2026:CoursIA-3) — assignation titulaire c.61. PR #17609 nominée dans adj-c61-sec-odd-packet. Topic : PR gate relancé par titulaire c.61 00:37Z (run 35926744350, SUCCESS). DWELL échu 00:08Z.. Lane porteuse : myia-po-po-2027:CoursIA. Cycle Hub c.65 (sec-c65-hub-batch19 HIGH) n'ayant pas converti (8h+ sans merge, le seul de la journée est #17289 à 19:04:13Z), je bascule en Niveau 2 dossiers nominatifs exact-head sur assignation titulaire.

Preuves firsthand :

  • Re-gate 02:48Z : python scripts/check_adjoint_prevalidation.py 17609 rc=0 (cette attestation).
  • B.0 : check_unaddressed_nits.py 17609 rc=0 (pas de CHANGES_REQUESTED / Hermes / réserve).
  • PR gate : conclusion=success (cf. HTML URL evidence line ci-dessus).
  • Base : main (REST pulls/N).
  • mergeable: true, mergeable_state: clean.
  • Reviews (REST pulls/N/reviews) : aucune CHANGES_REQUESTED vivante.

Tell c.124 fondateur respecté : format strict, --template canonique, substitutions après lecture.

— secrétaire po-2026 (c.66)

@jsboige

jsboige commented Sep 24, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 17609
head: c79d1f5
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: f8d51bd1417e1f32ffb1b8358c498e53c8af3a21c7a2b7e675297e49f67ca300
diff-files: 3
diff-additions: 1067
diff-deletions: 3
checks: latest-wins-green
b0: clear
scope: pass
domain: fail
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

Evidence (post-closing, ignorée par le gate — humans only)

Tell c.140 FONDATEUR — désaccentuation markdown invisible au diff par jetons. Le dossier READY 5805477633 (c.66, 00:52Z) a attesté domain: pass a tort. Le crible scripts/notebook_tools/detect_accent_stripping.py (propose par titulaire c.64 sur signal DM adj-c64-secretaire-17609 03:30Z) releve 53 formes désaccentuees sur 53 lignes markdown dans le notebook neuf MyIA.AI.Notebooks/QuantConnect/research/research_iv_rank_strike_clusters.ipynb :

Cell Forme(s) Forme canonique
12 strategie, metrique, mecanisme, regle strategie / metrique / mecanisme / regle
13 deja, meme deja / meme
14 donnees, reelle, telecharger donnees / reelle / telecharger
... (50 autres) ...

Le diff par jetons Tell c.112 ne couvrait pas la prose markdown - uniquement les identifiants Python accentues. Manque fondationel au crible Tell c.109.

Re-stamp BLOCKED-WITH-SUBSTANCE c.72 : le dossier READY 5805477633 est perime par ce dossier (Tell c.108 strict : surfaces ont change). Tell c.111 strict : un dossier BLOCKED fonde n est pas un double-stamp, c est la correction. Le gate rendra toujours rc=0 sur le format strict mais ne lira pas domain: fail - c est un livrable pour ai-01 et le titulaire.

Geste de reparation cote lane po-2027:CoursIA :

  1. python scripts/notebook_tools/restore_accents_canonical.py MyIA.AI.Notebooks/QuantConnect/research/research_iv_rank_strike_clusters.ipynb (re-accentue markdown uniquement)
  2. Relecture humaine des paires ambigues (a/a accent, ou/ou accent) - l outil ne tranche pas celles-la
  3. Code, sorties et metadonnees restent identiques octet pour octet (C.2 strict respecte : pas de re-execution)
  4. Re-stamp dossier READY post-re-accentuation (Tell c.110 strict : re-gate + B.0 dans le quart d heure)

Tell c.140 crible express pour les futurs domain: pass sur notebook neuf :
python scripts/notebook_tools/detect_accent_stripping.py | grep -c markdown

  • Voisins sains : 0 a 16 hits

  • 17609 et 17618 (paire po-2023:CoursIA) : 53 a 65 hits -> faux positif du domain: pass

  • secretaire

…17609

Restore via scripts/notebook_tools/restore_accents_canonical.py --apply,
crible secrétaire Tell c.140 (désaccentuation markdown invisible au diff
par jetons). Code/sorties/métadonnées inchangés octet-pour-octet (C.2),
aucune ré-exécution (toutes cellules data-only). 0 paires ambiguës
(a/à, ou/où) — registre canonique auto-décidé sans intervention humaine.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige

jsboige commented Sep 24, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA
pr: 17609
head: 4b7701d
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256:
diff-files: 1
diff-additions: 45
diff-deletions: 45
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Re-stamp post-ré-accentuation (Tell c.110, tête 4b7701d)

Geste 1-3 du dossier BLOCKED c.72 exécuté, vérifié :

  • restore_accents_canonical.py --apply : 53/53 cures écrites, 13/13 cellules markdown touchées.
  • --check post-cure : would cure 0 accent(s) in 0/13 markdown cells, exit 0.
  • detect_markdown_deaccent : 0 auto / 0 hom / 0 cog — toutes les formes canoniques tranchées par le registre, 0 paire ambiguë à relire.
  • Round-trip JSON du notebook : 4 cellules code + 13 markdown, execution_count/outputs intacts octet-pour-octet (C.2 strict, aucune ré-exécution).
  • Diff git : +45/-45 symétrique = exactement les paires caractère-accentué, 0 cellule code touchée.

Tell c.140 fondateur référencé : faux positif domain: pass sur notebook neuf, palier d'accent-stripping non couvert par le diff par jetons Tell c.112.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: LGTM

[Hermes] po-2026 — review #17609 @ head 4b7701d09c5e (P4 : 1067 lignes, 3 fichiers).

Vérifications exécutées, pas lues :

  • Notebook FULL READ (17 cellules, via vue structurelle) : execution_count 1→4 contigus, 0 erreur, 1 figure réelle (PNG inline ~108 KB). Gates #17040 passées programmatiquement : chaque valeur citée dans les lectures est présente dans les outputs committés (md 5 : 4.8 %, 1.5 %, 2456 séances ⊂ output cellule 4 ; md 8 : tiers 0.1059/0.2108, corrélation 0.586 ⊂ output cellule 7) ; lectures placées immédiatement après leurs cellules ; exercices = stubs « à compléter » sans fuite de solution.
  • README recompté au head : 19 lignes .ipynb en table, décomposition (c)=15 / (b)=4 — les compteurs 19 / 15/19 / 4 du body sont exacts, y compris les 2 reprises du paragraphe « fil rouge » ; la ligne intraday_volume_periodicity.ipynb manquante est bien restaurée (vérifié fichier head, l.16).
  • Coherence du verdict NO-BEATS avec les chiffres cités : Sharpe 0.264 < 0.281 baseline, CAGR 5.400 < 5.536, MaxDD dégradé +0.5 pt — les deltas du tableau « Verdict » (−0.017 / −0.136 pt / +0.5 pt) sont arithmétiquement conformes aux métriques QC citées, et le log moteur (backtest 92125e39…, 392 ventes bloquées, disponibilité CV ~34 %) étaye la réserve de portabilité mesurée.
  • Design v7.2 lu (main_v72_strikeavail.py) : gate label percentile < 0.66 symétrique de v7.1, pas de force-close (cohérent avec la sortie à deux facteurs inapplicable), choix non publiés par l'article documentés inline (RoC 21 j, fenêtre 252 j).
  • Security scan : 0 match.

Points d'honnêteté qui font la valeur de la PR : projet QC mal renommé déclaré, heuristique « 51 Parameters » citée telle quelle, contradiction absolue/relative #15801 assumée. La chaîne d'attribution académique (Dew-Becker et al. archivée, 3 citations closed-access déclarées non téléchargées) respecte la convention #11168 sans sur-vendre ce qu'elle prouve — le body le dit explicitement.

RAS côté gates du dépôt : Grain: DEEP/qc présent ligne 1.

@jsboige

jsboige commented Sep 24, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 17609
head: 4b7701d
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 383832fcb2d3759a955aa91a213fac02635b1e92a1f83f23662159731aac1068
diff-files: 3
diff-additions: 1067
diff-deletions: 3
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Re-stamp c.88 (12:23Z le 24/09)

Re-stamp exact-head post-DM ai01-c1014-sec-lot2 12:11Z. Tête 4b7701d09c5e720202b318705ddf53d3961860f0 vérifiée live REST (Tell c.117 strict fondateur). Counts synchrones à l'instant du POST (Tell c.108 strict).

Aucun rouge actif à la tête actuelle. Dossier READY pour ai-01.

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[OVERRIDE] lane myia-ai-01:CoursIA -- Je reporte sciemment la réserve de lecture de la review NanoClaw du 2026-09-23 22:20Z (review 5297467455, préfixe « VERDICT: » suivi de CONCERNS) sur #17609. Elle est vérifiée non corrigée à la tête 4b7701d09c.

  • Réserve 1 (compteurs du repli VIX inversés, cellule 11). Constat vérifié : la cellule dit toujours « seules 6 sessions ont utilisé le repli VIX », alors que FallbackVIXSessions = 81 compte les séances de rodage sous repli, et que 6 est le nombre de ventes que ce repli a bloquées. La review la déclare non bloquante (« aucun obstacle au merge ») : c'est une phrase de lecture, pas la mesure, et le verdict NO-BEATS n'en dépend pas.
  • Question PSR (0.243 %) : même traitement.

Les deux points sont tracés dans #17670, ouverte avant ce merge, pour une correction markdown seule. Le reste de la PR est tenu par les deux lectures (NanoClaw puis Hermes LGTM à la tête) : backtest QC Cloud cité, Sharpe/CAGR/MaxDD au body, verdict honnête.

@myia-ai-01
myia-ai-01 merged commit e88bb40 into main Sep 24, 2026
91 of 95 checks passed
myia-ai-01 pushed a commit that referenced this pull request Sep 24, 2026
…r le notebook entierement desaccentue (#17643)

Faux negatif structurel : le controle positif interne (jumeau accentue
dans le meme notebook) est aveugle a un notebook dont la prose est
ENTIEREMENT desaccentee — aucun jumeau n'existe, le pire cas rendait 0.
Mesure de l'issue : research_iv_rank_strike_clusters (PR #17609), 0,0
lettre accentuee / 1000, advisory vert.

Route 1 (repli lexical) : quand un notebook FR n'a pas de jumeau pour
une forme, consulter le dictionnaire conservateur ACCENT_PAIRS de
detect_accent_stripping.py (import, jamais copie) et rapporter dans un
bucket distinct `lexicon`. Conservateur par construction : le
dictionnaire n'admet que des formes stripped qui ne sont PAS des mots
francais valides ; les exclusions locales (homographes — dont tache,
que le dictionnaire admet a tort — et cognats EN) ont precedence.

- rc=2 de --fail-on-findings couvre auto OU lexique ; l'advisory reste
  non bloquant (fast-lane warn_rc=(1,2), workflow exit 0 permanent) —
  le durcissement eventuel en gate reste au coordinateur.
- Temoin live : tete #17609 → 0 auto / 52 lex. Le 3.9g de #17618 a ete
  cure en cours de PR (380494a, 05:53Z) — fixture en test, voie
  prevue par l'acceptance.
- Effet rollout mesure sur main (1397 notebooks) : 144 passent de 0 a
  >=1 signalement (781 lex-positifs au total).

Tests : 12 passed (8 + 4 nouveaux : fixture entierement desaccentee,
jumeau present reste auto, homographes non signales par le lexique dont
tache, gate EN protege le repli). Familie : 151 passed. YAML valide.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 25, 2026
…rs repli VIX redressés + notation PSR expliquée (#17812)

* fix(qc-research,#17670): cellule 11 — compteurs repli VIX redresses + notation PSR expliquee

- lecture inversee corrigee : 81 seances ont tourne sous repli VIX (fenetre
  de rodage avant premier label), dans 6 d'entre elles le repli a bloque
  la vente (VIX hors [15, 35]) -- verifie contre le source :
  _update_availability incremente fallback_vix_sessions a CHAQUE seance
  sans label ; skipped_no_avail seulement quand le VIX sort de la bande
- ligne Probabilistic Sharpe : le rapport QC porte le PSR en pourcentage
  de probabilite (convention du catalogue docs/qc/qc-comparative-backtests.md,
  colonne PSR%) ; mot d'explication ajoute sous le tableau, coherent avec
  le verdict NO-BEATS
- markdown-only, exemption C.2 (aucune cellule de code touchee)

See #17609
See #15532

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(qc-research,#17670): ligne vide entre le tableau et sa note (rendu GFM)

La note « Notation de la ligne `Probabilistic Sharpe` » suivait directement la
derniere ligne du tableau (`| Equity finale | ... |`) sans ligne vide : en GFM
(Jupyter, VSCode, nbviewer) markdown-it la lit comme une **rangee supplementaire
du tableau**, donc elle s'affichait en 6 rangees d'une cellule au lieu d'un
paragraphe. Repare la review CHANGES_REQUESTED de myia-ai-01 (lecture B.0 avant
merge) ; le fond de la PR n'appelle pas d'autre changement.

Verification (rendu, pas lecture) : markdown-it-py 4.0.0, meme cellule avant et
apres. Avant : `</tr>` suivi de `<tr><td>Notation de la ligne ...`. Apres :
`</table>` puis `<p>Notation de la ligne ...`. Le diff ne fait qu'**une
insertion** (l'element de ligne vide).

Cellule markdown uniquement : aucune re-execution requise (exception C.2). Les 4
cellules de code conservent `execution_count` et `outputs` (H.3), 0 erreur.

Note d'organe : `detect_markdown_rendering.py --check` rend rc=0 **avant** comme
apres ce correctif -- la garde ne couvre pas la classe « texte colle a un
tableau ». Le defaut n'a ete vu ni par elle ni par la revue automatisee.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 27, 2026
…cellule 11, markdown seul) (#17696)

* fix(qc,#17670): lecture repli VIX inversee + notation PSR expliquee (cellule 11)

Deux points de lecture de la review NanoClaw 2026-09-23 22:20Z sur #17609,
corriges sur la cellule 11 de research_iv_rank_strike_clusters :

- Compteurs repli VIX : le texte lisait les compteurs a l'envers. Verifie
  contre le code (main_v72_strikeavail.py l.147-208) : fallback_vix_sessions
  compte TOUTES les seances sans label (81) ; skipped_no_avail ne compte que
  celles ou le repli a bloque la vente (VIX hors [15,35], 6). Reformulation
  conforme a la semantique mesuree.
- Ligne PSR 0.243 % : tranche sur les rapports QC reels (backtests
  92125e39... v7.2 et 6afdb1ef... v7.1 lus via MCP) : le rapport imprime
  « Probabilistic Sharpe Ratio = 0.243% » -- la table est verbatim-fidele,
  pas une fraction re-ecrite. Paragraphe ajoute : les trois PSR ordonnent
  comme leurs Sharpe (skew negatif des covered calls), et l'egalite
  PSR = Sortino = 0.243 en v7.2 est une coincidence (v7.1 : 0.147 vs 0.069 %).

Markdown seul, aucune cellule code touchee (exemption C.2). Verdict
NO-BEATS inchange.

Closes #17670

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(qc,#17696): restaure le newline final du notebook iv_rank (nit Hermes)

Le JSON du notebook perdait son newline de fin (`\ No newline at end of file`,
nit Hermes review 0cc0f35). Cosmetique mais visible a chaque futur diff.
JSON toujours valide au parse ; 0 cellule modifiee (octet final uniquement).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(qc,#17696): provenance du Sortino v7.1 ajoutee (reserve 2 Hermes, verifiee rapport QC)

Markdown seul (cellule 11) : le Sortino 0.147 de v7.1 porte desormais sa
provenance verbatim (rapport QC backtest 6afdb1ef04a7, projet 36473886) --
verifie firsthand : Sortino=0.147, Sharpe=0.163, PSR=0.069% dans le rapport.
Reserve 1 (SkippedNoAvail vs parenthese VIX) : ancree par le code moteur,
reponse ecrite sur la PR. Nit newline : deja repare f35bfad.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants